// Copyright 2013 Tumblr, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package circuit

import (
	"circuit/use/n"
	"circuit/use/worker"
)

type runtime interface {
	// Low-level
	WorkerAddr() n.Addr
	SetBoot(interface{})
	Kill(n.Addr) error

	// Spawn mechanism
	Spawn(worker.Host, []string, Func, ...interface{}) ([]interface{}, n.Addr, error)
	RunInBack(func())

	// Cross-services
	Dial(n.Addr, string) PermX
	DialSelf(string) interface{}
	TryDial(n.Addr, string) (PermX, error)
	Listen(string, interface{})

	// Persistence of PermX values
	Export(...interface{}) interface{}
	Import(interface{}) ([]interface{}, string, error)

	// Cross-interfaces
	Ref(interface{}) X
	PermRef(interface{}) PermX

	// Type system
	RegisterValue(interface{})
	RegisterFunc(Func)

	// Utility
	Hang()
}
